Crear en código botones con eventos asociados

De nuevo, tras una pregunta en los foros de ASP.NET en castellano he decidido responder con un artículo en lugar de escribir una larga respuesta

El objetivo es que mediante nuestro propio código, podamos crear controles del tipo Button de modo que se muestren en pantalla donde nosotros decidamos, y además tengan asociado un evento Click.

A continuación os muestro un código totalmente genérico y aplicable a vuestras aplicaciones en particular.
Está comentado:

ejemploButton.aspx
        <asp:Label ID="Label1" runat="server">No has hecho click sobre ningún botón</asp:Label>
        <br /><br />
        <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>



ejemploButton.aspx.cs
    protected void Page_Load(object sender, EventArgs e)
    {
        // Declaramos el Button y un literal que nos servirá para hacer saltos de línea
        Button bt;
        Literal lt;

        // Por ejemplo crearemos 5 botones,
        // pero nuestra fuente de información puede ser cualquier otra
        for (int i = 0; i < 5; i++)
        {
            // Inicializamos el botón
            bt = new Button();

            // Le asignamos un text
            bt.Text = "Botón " + i;

            // Hacemos que maneje el evento Click mediante la función bt_Click
            bt.Click += new EventHandler(bt_Click);

            // Inicializamos el literal y hacemos que sea un salto de línea HTML
            lt = new Literal();
            lt.Text = "<br />";

            // Ubicamos ambos controles en el PlaceHolder que hemos puesto en nuestra página
            // El uso del PlaceHolder no es obligatorio ni mucho menos,
            // podéis añadir los controles donde os haga falta:
            // una Cell de un Table, un Panel, a la propia Page, etc.
            PlaceHolder1.Controls.Add(bt);
            PlaceHolder1.Controls.Add(lt);
        }
    }

    // Los métodos manejadores de eventos tienen una estructura muy sencilla.
    // Son métodos como cualquier otro, pero (habitualmente) tienen dos parámetros de entrada.
    // "sender" es el objeto que ha lanzado el evento. Deberemos parsearlo al tipo que nosotros consideremos.
    // "e" son los argumentos del evento. Deberemos parsearlos al tipo que consideremos si lo quisieramos usar.
    protected void bt_Click(object sender, EventArgs e)
    {
        // Como sabemos que quien lanza el evento es un Button, lo parseamos y lo recogemos en una variable
        Button bt = (Button)sender;

        // Ahora podemos hacer lo que creamos conveniente con el Button. Ej:
        Label1.Text = "Has hecho click en el botón " + bt.Text;
    }


Espero que os sirva!!