Ho risolto lavorando direttamente sull'ItemDataBound.
Come nel codice precedente il mio DataSource è una DataTable.

codice:
		protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
		{
			switch(e.Item.ItemType)
            {
				case ListItemType.Header:
					e.Item.Controls.Add(new LiteralControl("<table>"));
					e.Item.Controls.Add(new LiteralControl("\r\n\t<tr>"));
					for (int i = 0; i < ((DataTable)Repeater1.DataSource).Columns.Count; i++)
					{
						e.Item.Controls.Add(new LiteralControl("\r\n\t\t<td>"));
						Label l = new Label();
						l.ID = "Test " + i.ToString();
						l.Text = ((DataTable)Repeater1.DataSource).Columns[i].ToString();
						e.Item.Controls.Add(l);
						e.Item.Controls.Add(new LiteralControl("</td>"));
					}
					e.Item.Controls.Add(new LiteralControl("\r\n\t</tr>"));
					break;

				case ListItemType.Item:
					for (int j = 0; j < ((DataTable)Repeater1.DataSource).Rows.Count; j++)
					{
						e.Item.Controls.Add(new LiteralControl("\r\n\t<tr>"));
						for (int i = 0; i < ((DataTable)Repeater1.DataSource).Columns.Count; i++)
						{
							e.Item.Controls.Add(new LiteralControl("\r\n\t\t<td>"));
							Label l = new Label();
							l.ID = "Test item" + i.ToString();
							l.Text = ((DataTable)Repeater1.DataSource).Rows[j][i].ToString();
							e.Item.Controls.Add(l);
							e.Item.Controls.Add(new LiteralControl("</td>"));
						}
						e.Item.Controls.Add(new LiteralControl("\r\n\t</tr>"));
					}
					break;

				case ListItemType.Footer:
					e.Item.Controls.Add(new LiteralControl("</table>"));
					break;

            }

		}