Das ist doch ganz einfach, wenn Du beim Page_Load die Anzahl der Zeilen/Spalten kennst.
Du legst im ASP.NET "HTML"-Text-Teil eine ganz normale, aber leere, Tabelle an, gibst ihr aber zusätzlich eine id und setzt die runat Eigenschaft auf "server". Nun kannst Du auf die Tabelle wie auf ein Objekt, dass den Namen trägt, den Du als id angegeben hast, zugreifen und nach belieben Veränderungen vornehmen.
Du musst den HTML-Quelltext für die fertige Tabelle also nicht selbst erzeugen und als Zeichenkette herausschreiben, sondern kannst die Erzeugung der "<tr>"s und "<td>"s der ASP.NET Runtime überlassen.
Brauchst Du ein Beispiel?