Check this example. Now please take its reference and correct your code as per your requirement.
HTML
<div>
    <asp:CheckBoxList runat="server" ID="cblColumnName">
        <asp:ListItem Text="Name" Value="Name" />
        <asp:ListItem Text="Type" Value="Type" />
    </asp:CheckBoxList>
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Panel ID="Panel1" runat="server">
                <div class="container">
                    <div class="row">
                        <div class="col-md-2">
                            <div class="spacer">
                                <asp:LinkButton runat="server" CssClass="btn btn-danger" ID="lnkLoad" OnClick="lnkLoad_Click">Load</asp:LinkButton>
                            </div>
                        </div>
                        <div class="col-md-10">
                            <asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="true" OnRowDataBound="OnRowDataBound"
                                CssClass="table table-hover table-bordered" EmptyDataText="No Items Available"
                                OnRowEditing="OnRowEditing">
                                <Columns>
                                    <asp:TemplateField ShowHeader="False">
                                        <EditItemTemplate>
                                            <asp:LinkButton ID="LinkButton1" runat="server" OnClick="OnUpdate"><span class="fa fa-check-square-o"></span></asp:LinkButton>
                                            <asp:LinkButton ID="LinkButton2" runat="server" OnClick="OnCancel"><span class="fa fa-window-close"></span></asp:LinkButton>
                                        </EditItemTemplate>
                                        <ItemTemplate>
                                            <asp:LinkButton ID="LinkButton3" runat="server" CommandName="Edit"><span class="fa fa-pencil-square-o"></span></asp:LinkButton>
                                        </ItemTemplate>
                                    </asp:TemplateField>
                                </Columns>
                            </asp:GridView>
                        </div>
                    </div>
            </asp:Panel>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>
<br />
<asp:Button Text="Delete Name Column" runat="server" OnClick="DeleteNameColumn" />
Code
C#
protected void Page_Load(object sender, EventArgs e)
{
    if (!this.Page.IsPostBack)
    {
        try
        {
            this.BindGrid();
        }
        catch (Exception ex)
        {
            string message = "alert('" + ex.Message.ToString() + "');";
            ScriptManager.RegisterStartupScript(sender as Control, this.GetType(), "alert", message, true);
        }
    }
}
protected void BindGrid()
{
    this.GridView1.DataSource = (DataTable)Session["GridView1"];
    this.GridView1.DataBind();
}
private DropDownList TypesCombobox()
{
    DropDownList DownList = new DropDownList();
    DownList.Items.Add(new ListItem("TextBox", "TextBox"));
    DownList.Items.Add(new ListItem("ComBobox", "Combobox"));
    return DownList;
}
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DataRowView drv = (DataRowView)e.Row.DataItem;
        if (drv.Row.Table.Columns.Contains("Type") && this.GridView1.EditIndex == e.Row.RowIndex)
        {
            string TypeValue = drv["Type"].ToString();
            int index = drv.Row.Table.Columns["Type"].Ordinal + 1;
            DropDownList dropDownList = this.TypesCombobox();
            dropDownList.ID = "ddlTypesControl" + drv.Row.Table.Columns["Type"].Ordinal.ToString();
            TableCell CellItem = e.Row.Cells[index] as TableCell;
            if (!string.IsNullOrEmpty(TypeValue))
            {
                dropDownList.Items.FindByValue(TypeValue).Selected = true;
            }
            CellItem.Controls.Remove(CellItem.Controls[0] as TextBox);
            CellItem.Controls.Add(dropDownList);
        }
    }
}
protected void OnRowEditing(object sender, GridViewEditEventArgs e)
{
    this.GridView1.EditIndex = e.NewEditIndex;
    this.BindGrid();
}
protected void OnUpdate(object sender, EventArgs e)
{
    try
    {
        GridViewRow row = (sender as LinkButton).NamingContainer as GridViewRow;
        DataTable dt = (DataTable)Session["GridView1"];
        for (int i = 0; i < row.Cells.Count - 1; i++)
        {
            string values = string.Empty;
            if (dt.Columns[i].ToString() != "Type")
            {
                values = (row.Cells[i + 1].Controls[0] as TextBox).Text;
            }
            else
            {
                values = (row.Cells[i + 1].Controls[0] as DropDownList).SelectedValue.ToString(); ;
            }
            dt.Rows[row.RowIndex][dt.Columns[i]] = values;
        }
        Session["GridView1"] = dt;
        this.GridView1.EditIndex = -1;
        this.BindGrid();
    }
    catch (Exception ex)
    {
        string message = "alert('" + ex.Message.ToString() + "');";
        ScriptManager.RegisterStartupScript(sender as Control, this.GetType(), "alert", message, true);
    }
}
protected void OnCancel(object sender, EventArgs e)
{
    this.GridView1.EditIndex = -1;
    this.BindGrid();
}
protected void lnkLoad_Click(object sender, EventArgs e)
{
    this.gettable();
    DataTable dt = GetDataTable();
    var lbData = new List<ListItem>();
    foreach (DataColumn cloumn in dt.Columns)
    {
        lbData.Add(new ListItem(cloumn.ColumnName, cloumn.ColumnName));
    }
    cblColumnName.DataSource = lbData;
    cblColumnName.DataTextField = "Text";
    cblColumnName.DataValueField = "Text";
    cblColumnName.DataBind();
}
private void gettable()
{
    try
    {
        DataTable dt = GetDataTable();
        Session["GridView1"] = dt;
        this.BindGrid();
    }
    catch (Exception ex)
    {
        string message = "alert('" + ex.Message.ToString() + "');";
        ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", message, true);
    }
}
private DataTable GetDataTable()
{
    DataTable dt = new DataTable();
    dt.Columns.Add(new DataColumn("Name", typeof(string)));
    dt.Columns.Add(new DataColumn("Type", typeof(string)));
    dt.Rows.Add("NameTest1", "TextBox");
    dt.Rows.Add("NameTest2", "Combobox");
    dt.Rows.Add("NameTest3", "Combobox");
    dt.Rows.Add("NameTest4", "TextBox");
    dt.Rows.Add("NameTest5", "TextBox");
    return dt;
}
protected void DeleteNameColumn(object sender, EventArgs e)
{
    DataTable dt = (DataTable)Session["GridView1"];
    for (int i = 0; i < cblColumnName.Items.Count; i++)
    {
        if (cblColumnName.Items[i].Selected)
        {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                if (dt.Columns[j].ColumnName.ToUpper() == cblColumnName.Items[i].Text.ToUpper())
                {
                    dt.Columns.Remove(cblColumnName.Items[i].Text);
                }
            }
        }
    }
    dt.AcceptChanges();
    Session["GridView1"] = dt;
    this.BindGrid();
}
VB.Net
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    If Not Me.Page.IsPostBack Then
        Try
            Me.BindGrid()
        Catch ex As Exception
            Dim message As String = "alert('" & ex.Message.ToString() & "');"
            ScriptManager.RegisterStartupScript(TryCast(sender, Control), Me.[GetType](), "alert", message, True)
        End Try
    End If
End Sub
Protected Sub BindGrid()
    Me.GridView1.DataSource = CType(Session("GridView1"), DataTable)
    Me.GridView1.DataBind()
End Sub
Private Function TypesCombobox() As DropDownList
    Dim DownList As DropDownList = New DropDownList()
    DownList.Items.Add(New ListItem("TextBox", "TextBox"))
    DownList.Items.Add(New ListItem("ComBobox", "Combobox"))
    Return DownList
End Function
Protected Sub OnRowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim drv As DataRowView = CType(e.Row.DataItem, DataRowView)
        If drv.Row.Table.Columns.Contains("Type") AndAlso Me.GridView1.EditIndex = e.Row.RowIndex Then
            Dim TypeValue As String = drv("Type").ToString()
            Dim index As Integer = drv.Row.Table.Columns("Type").Ordinal + 1
            Dim dropDownList As DropDownList = Me.TypesCombobox()
            dropDownList.ID = "ddlTypesControl" & drv.Row.Table.Columns("Type").Ordinal.ToString()
            Dim CellItem As TableCell = TryCast(e.Row.Cells(index), TableCell)
            If Not String.IsNullOrEmpty(TypeValue) Then
                dropDownList.Items.FindByValue(TypeValue).Selected = True
            End If
            CellItem.Controls.Remove(TryCast(CellItem.Controls(0), TextBox))
            CellItem.Controls.Add(dropDownList)
        End If
    End If
End Sub
Protected Sub OnRowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs)
    Me.GridView1.EditIndex = e.NewEditIndex
    Me.BindGrid()
End Sub
Protected Sub OnUpdate(ByVal sender As Object, ByVal e As EventArgs)
    Try
        Dim row As GridViewRow = TryCast((TryCast(sender, LinkButton)).NamingContainer, GridViewRow)
        Dim dt As DataTable = CType(Session("GridView1"), DataTable)
        For i As Integer = 0 To row.Cells.Count - 1 - 1
            Dim values As String = String.Empty
            If dt.Columns(i).ToString() <> "Type" Then
                values =(TryCast(row.Cells(i + 1).Controls(0), TextBox)).Text
            Else
                values =(TryCast(row.Cells(i + 1).Controls(0), DropDownList)).SelectedValue.ToString()
            End If
            dt.Rows(row.RowIndex)(dt.Columns(i)) = values
        Next
        Session("GridView1") = dt
        Me.GridView1.EditIndex = -1
        Me.BindGrid()
    Catch ex As Exception
        Dim message As String = "alert('" & ex.Message.ToString() & "');"
        ScriptManager.RegisterStartupScript(TryCast(sender, Control), Me.[GetType](), "alert", message, True)
    End Try
End Sub
Protected Sub OnCancel(ByVal sender As Object, ByVal e As EventArgs)
    Me.GridView1.EditIndex = -1
    Me.BindGrid()
End Sub
Protected Sub lnkLoad_Click(ByVal sender As Object, ByVal e As EventArgs)
    Me.gettable()
    Dim dt As DataTable = GetDataTable()
    Dim lbData = New List(Of ListItem)()
    For Each cloumn As DataColumn In dt.Columns
        lbData.Add(New ListItem(cloumn.ColumnName, cloumn.ColumnName))
    Next
    cblColumnName.DataSource = lbData
    cblColumnName.DataTextField = "Text"
    cblColumnName.DataValueField = "Text"
    cblColumnName.DataBind()
End Sub
Private Sub gettable()
    Try
        Dim dt As DataTable = GetDataTable()
        Session("GridView1") = dt
        Me.BindGrid()
    Catch ex As Exception
        Dim message As String = "alert('" & ex.Message.ToString() & "');"
        ScriptManager.RegisterStartupScript(Me, Me.[GetType](), "alert", message, True)
    End Try
End Sub
Private Function GetDataTable() As DataTable
    Dim dt As DataTable = New DataTable()
    dt.Columns.Add(New DataColumn("Name", GetType(String)))
    dt.Columns.Add(New DataColumn("Type", GetType(String)))
    dt.Rows.Add("NameTest1", "TextBox")
    dt.Rows.Add("NameTest2", "Combobox")
    dt.Rows.Add("NameTest3", "Combobox")
    dt.Rows.Add("NameTest4", "TextBox")
    dt.Rows.Add("NameTest5", "TextBox")
    Return dt
End Function
Protected Sub DeleteNameColumn(ByVal sender As Object, ByVal e As EventArgs)
    Dim dt As DataTable = CType(Session("GridView1"), DataTable)
    For i As Integer = 0 To cblColumnName.Items.Count - 1
        If cblColumnName.Items(i).Selected Then
            For j As Integer = 0 To dt.Columns.Count - 1
                If dt.Columns(j).ColumnName.ToUpper() = cblColumnName.Items(i).Text.ToUpper() Then
                    dt.Columns.Remove(cblColumnName.Items(i).Text)
                End If
            Next
        End If
    Next
    dt.AcceptChanges()
    Session("GridView1") = dt
    Me.BindGrid()
End Sub
Screenshot
