HTML: you have to use TemplateField inside column and set the headertext property. Make sure that gridview AutoGenerateColumns property is set to false
<asp:GridView ID="gvColumnDemo" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="Empolyee Details">
<ItemTemplate>
<asp:Label ID="lblId" runat="server" Text='<%#Eval("Id") %>'></asp:Label>
<asp:Label ID="lblName" runat="server" Text='<%#Eval("Name") %>'></asp:Label>
<asp:Label ID="Label1" runat="server" Text='<%#Eval("Country") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
CODE: Here i have binded gridview with dummy table
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[3] { new DataColumn("Id", typeof(int)),
new DataColumn("Name", typeof(string)),
new DataColumn("Country",typeof(string)) });
dt.Rows.Add(1, "John Hammond", "United States");
dt.Rows.Add(2, "Mudassar Khan", "India");
dt.Rows.Add(3, "Suzanne Mathews", "France");
dt.Rows.Add(4, "Robert Schidner", "Russia");
gvColumnDemo.DataSource = dt;
gvColumnDemo.DataBind();