in teoria quello che hai fatto sembrerebbe giusto, invece il motore asp.net si incazza di brutto.

anche io ci ho sbattuto parecchio la testa

alla fine invece di fare il render del gridview, creo un controllo htmlTable, lo riempo con le righe del gridview e poi faccio il write di quello, che non fa incazzare asp.net perché non ha bisogno del form runat server.

una cosa simile a:
codice:
foreach(DataRow row in gridview.DataSource)
{
   HtmlTableRow tRow = new HtmlTableRow();

   //faccio anche il for sulle celle
      HtmlTableCell tCella = new HtmlTableCell("td");
      //faccio i controlli dei tipi dati, stile, valori ecc...
      tRow.Cells.Add(tCella);

   myTabella.Rows.Add(tRow);
}