Try this code.
Once you spanned the table cell, we should remove others.
public partial class _Default : System.Web.UI.Page
{
private bool _alternate = false;
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = new DataSet();
ds.Tables.Add(new DataTable("Employee"));
ds.Tables[0].Columns.Add("Id");
ds.Tables[0].Columns.Add("Name");
ds.Tables[0].Rows.Add("1", "Name1");
ds.Tables[0].Rows.Add("1", "Name2");
ds.Tables[0].Rows.Add("2", "Name3");
ds.Tables[0].Rows.Add("2", "Name4");
GridView1.DataSource = ds;
GridView1.DataMember = "Employee";
GridView1.DataBind();
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
GridView1.RowDataBound += new GridViewRowEventHandler(GridView1_RowDataBound);
}
void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (_alternate)
{
e.Row.Cells[0].ColumnSpan = 2;
e.Row.Cells.RemoveAt(1);
}
_alternate = !_alternate;
}
}