Un esempio di come raggruppare, con una ListView, un set di dati in base ad una proprietà. In questo caso la proprietà Name

Nella pagina aspx definisco nell' ItemTemplate due righe che possiamo definire template, quella per il gruppo (trGroup con attributo runat="server") e quella per le righe.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestListViewGrupping._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Sgart.it - Test raggruppamento con ListView</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:ListView id="lv" runat="server" onitemdatabound="lv_ItemDataBound">
      <LayoutTemplate>
        <table border="1">
          <asp:PlaceHolder ID="ItemPlaceholder" runat="server" />  
        </table>
      </LayoutTemplate>
        <ItemTemplate>

          <!-- template di gruppo -->
          <tr runat="server" id="trGroup">
            <td style="font-wheight:bold;">Group: <%# Eval("Name") %></td>
          </tr>

          <!-- template di riga -->
          <tr>
            <td><%# Eval("ID") %></td>
          </tr>

        </ItemTemplate>
      </asp:ListView> 
    </div>
    </form>
</body>
</html>

nel codebeind nell'evento ItemDataBound memorizzo la stringa che rappresenta il gruppo (variabile PreviousGroup) e se cambia rispetto al precedente visualizzo la riga che rappresenta l'intestazione di gruppo (id="trGroup")
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TestListViewGrupping
{
  public partial class _Default : System.Web.UI.Page
  {
    //singolo item della riga per dati di test
    public class ItemTest
    {
      public string Name { get; set; }
      public int ID { get; set; }
    }

    // variabile di raggruppamento
    private string PreviousGroup { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
      PreviousGroup = "";
      if (!Page.IsPostBack)
      {
        //dati di prova
        List<ItemTest> item = new List<ItemTest>();
        item.Add(new ItemTest() { Name = "g1", ID = 1 });
        item.Add(new ItemTest() { Name = "g1", ID = 2 });
        item.Add(new ItemTest() { Name = "g2", ID = 3 });
        item.Add(new ItemTest() { Name = "g2", ID = 4 });
        item.Add(new ItemTest() { Name = "g3", ID = 5 });

        lv.DataSource = item;
        lv.DataBind();
      }
    }

    protected void lv_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        Control ctrl = e.Item.FindControl("trGroup");
        if (ctrl != null)
        {
          System.Web.UI.WebControls.ListViewDataItem data = (System.Web.UI.WebControls.ListViewDataItem)e.Item;
          ItemTest row = (ItemTest)data.DataItem;
          //controllo il raggruppamento per "Name"
          ctrl.Visible = row.Name != PreviousGroup;
          PreviousGroup = row.Name;
        }
    }
  }
}