Here's a simple example:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
Button button = new Button();
button.ID = "Button1";
button.Text = "Button1";
PlaceHolder1.Controls.Add(button);
button.Click += new EventHandler(Button1_Click);
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "Button1_Click";
}
The gist of it is that you need to have some sort of server-side object with an event handler attached to your server-side function. Be sure to put ID's on your dynamically created controls.