Although you can dynamically load controls and add them to the Page class Controls collection, it seems to me that the best solution for your problem is to take advantage of some kind of template bound control that gives you control on the datatemplate. You can structure the template with the controls you want added to the page and they will be repeated based on the data you are binding to.
A simple example with a Repeater control might look as follows:
<asp:Repeater id="dataRepeater" runat="server">
<ItemTemplate>
<asp:ListBox id="myList" runat="server" />
<asp:TextBox id="myText" runat="server" Text='<%#Eval("MyDataField")%>' />
<div> Plain Html </div>
</ItemTemplate>
</asp:Repeater>
You have the ability to have alternating item templates. Also, with hierarchical data, you can make a couple of passes at the Item which your Repeater is binding to. For example, assuming I wanted to bind the ListBox to a collection of its own, I could bind the Repeater and then make another pass at the Items collection, use the FindControl method to find my ListBox and then act on it's own DataSource.
foreach (var item in dataRepeater.Items)
{
var listBox = item.FindControl("myList") as ListBox;
listBox.DataSource = moreData;
listBox.DataTextField = "Text";
listBox.DataValueField = "Value";
listBox.DataBind();
}
The Repeater, DataList and other template bound controls support events too, things like ItemDataBound that you can use to operate on your templates as well. You can do things like toggle visibility of controls that are already in the template or insert a child control if you want to have control over what is inside each template item based on what's in your database.
As noted above, you can use some other template engine but the concept would be fairly similar. The idea is that you allow your template to drive the HTML that is rendered as opposed to trying to operate and manage the control tree yourself.