no, non è proprio così strano.

se tu fai la procedura nel Page_load, in verità la pagina html non esiste ancora.
Facendo un controls.add, è vero che aggiungi un istanza di un controllo nella collection dell'istanza della Page, ma senza una posizione;
quindi al momento del render del codice HTML, questo controllo o non viene proprio preso in cosiderazione, o chissà dove va a finire (questo non te lo so dire)
Quello che so di certo è che deve avere un contenitore definito nella parte aspx.
Potresti provare ad usare la form come contenitore, visto che ha la proprietà runat=server

ciao