プログラムでボタンを生成する前に、次を使用してボタンをクリアする必要があります。
for (int i = 0; i < buttons.Length; i++)
    this.Controls.Remove(buttons[i]);
ただし、前世代のボタンはすべて残っています。何が原因でしょうか?
(以下は関数全体で、他の関数では numButton が変化します。)
    int numButtons = 5;
    Button[] buttons = new Button[10];
    private void generate_buttons()
    {
        for (int i = 0; i < buttons.Length; i++)
        {
            this.Controls.Remove(buttons[i]);
        }
        for (int i = 0; i < numButtons; i++)
        {
            buttons[i] = new Button();
            buttons[i].Name = "btn" + i.ToString();
            buttons[i].Text = Convert.ToString(i + 1);
            buttons[i].Size = new Size(40, 24);
            int yOffset = 40;
            int xOffset = 20 + i * 42;
            buttons[i].Location = new Point(xOffset, yOffset);
            buttons[i].BackColor = System.Drawing.SystemColors.Control;
            buttons[i].Enabled = false;
            buttons[i].Click += new EventHandler(this.clickMe);
            buttons[i].Visible = true;
            this.Height = yOffset + 104;
            this.Width = xOffset + 75;
        }
        Controls.AddRange(buttons);
    }