You can have gridview with 5 columns (where 1st and 3rd are fixed) and second is shown / hidden depending on the value of the first
Your gridview would then look like this:
1st
2nd a) textbox
2nd b) dropdown
2nd c) range
3rd
Then in CellFormatting event you check the value of 1st column and show / hide 2nd appropriately.
Something like this (in CellFormatting event):
DataRowView drv = CType (dgv.Rows[e.RowIndex].DataBoundItem, DataRowView);
dgv.columns["2nda"].Visible = (drv["1st"] == value1);
dgv.columns["2ndb"].Visible = (drv["1st"] == value2);
dgv.columns["2ndc"].Visible = (drv["1st"] == value3);
e.FormattingApplied = True;