You can use CommandArgument to store the value, then get it back from the sender on the click event.
protected void Page_Load(object sender, EventArgs e)
{
Button b = new Button();
b.ID = "btnTest";
b.CommandArgument = "42";
b.Click += new EventHandler(btnTest_Click);
b.Text = "clickme";
placeholder.Controls.Add(b);
}
protected void btnTest_Click(object sender, EventArgs e)
{
var button = (Button)sender;
throw new Exception(button.CommandArgument.ToString());
}