Mi aggangio a questa discussione.
Ho provato a elaborare il codice postato in quanto anche a me serve ottenere la dinamicità della tabella, perchè sto realizzando uno usercontrol che andrà sfruttato su svariate tabelle e svariati portali.

Il problema è che il repeater non viene popolato, e a livello di sorgente html della pagina è come se non esistesse.

Questa è la mia interpretazione del codice sopra scritto. Per comodità in questa fase di test e prove varie la classe MyTemplate è nel medesimo file dello UserControl.

codice:
namespace web_test
{
	public partial class UCTest : System.Web.UI.UserControl
	{
		private string strSQL = "";
		protected void Page_Load(object sender, EventArgs e)
		{
			DataTable dt=new DataTable();
			OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=web_test\\App_Data\\Newsletter.mdb");
			con.Open();

			string cmdstr = "select * from Newsletter";
			OleDbCommand aCommand = new OleDbCommand(cmdstr, con);
			OleDbDataReader aReader = aCommand.ExecuteReader();
			dt.Load(aReader);		

			Repeater1.HeaderTemplate = new MyTemplate(ListItemType.Header, dt);
			Repeater1.ItemTemplate = new MyTemplate(ListItemType.Item, dt); //, ...., ... altri parametri specifici per le mie esigenze);
			Repeater1.FooterTemplate = new MyTemplate(ListItemType.Footer,dt);
			Repeater1.DataBind();

			aReader.Close();
			con.Close();
		}

		public string SQLString
		{
			get { return strSQL; }
			set { strSQL=value;}
		}
	}

	public partial class MyTemplate : ITemplate
	{
		private ListItemType templateType;
		private DataTable objSource;
		public MyTemplate(ListItemType Type, DataTable objStruct) 
		{
			templateType = Type;
			objSource = objStruct;
		}


		public void InstantiateIn(System.Web.UI.Control container)
		{
			PlaceHolder ph = new PlaceHolder();

			switch (templateType)
			{
				case ListItemType.Header:
					HtmlTableRow row1 = new HtmlTableRow();
					ph.Controls.Add(new LiteralControl("<table>"));
					for (int i = 0; i < objSource.Columns.Count; i++)
					{
						HtmlTableCell cell=new HtmlTableCell();
						cell.InnerHtml=objSource.Columns[i].ColumnName;
						row1.Cells.Add(cell);
					}
					
					ph.Controls.Add(row1);
					break;

				case ListItemType.Item:
					HtmlTableRow rowi = new HtmlTableRow(); //Riga Item Template
					rowi.EnableViewState = false;
					for (int j = 0; j < objSource.Rows.Count; j++)
					{

						for (int i = 0; i < objSource.Columns.Count; i++)
						{
							HtmlTableCell cell = new HtmlTableCell();
							cell.InnerHtml = objSource.Rows[j][i].ToString();
							rowi.Cells.Add(cell);
						}
					}
					ph.Controls.Add(rowi);
//					ph.DataBinding += new EventHandler(Item_DataBinding);
					break;

				case ListItemType.AlternatingItem:

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

			}
			container.Controls.Add(ph);
		}

	}
}
Rispondo già alla prima domanda:
Si, lo usercontrol è stato inserito correttamente all'interno della pagina, in quanto se lo popolo con dati statici (quindi sapendo in precedenza i campi da visualizzare) l'oggetto viene inserito e popolato correttamente nella pagina html generata.