Dynamically created controls must be re-created on every postback. From the code you posted it appears that you could do this in markup instead. If not, you'll have to re-create the dynamic controls on every postback.
Your mark up code should be:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowCommand="GridView1_RowCommand" OnRowEditing="GridView1_RowEditing"/>
}
Key thing is that you need to move your code from Page_Load to Page_Init. Things added in the Page_Load last only for the lifecycle of one postback.
protected void Page_Load(object sender, EventArgs e)
{
BindGridView();
}