I finally figured out an acceptable solution. The TemplateFields themselves are automatically restored from viewstate, but the templates themselves aren't (the field's Item/Header/FooterTemplate properties are null). Note: I can't explain it, but I have to call gv.Columns.Clear() before adding...