To reproduce: BindingList<Item> items = new BindingList<Item>(); public Form1() { InitializeComponent(); Item dataItem1 = new Item(1); dataItem1.Name = "Cat"; dataItem1.GroupName = "Animal"; dataItem1.GroupSortPriority = 2; items.Add(dataItem1); Item dataItem2 = new Item(2); dataItem2.Name = "Kitten"; dataItem2.GroupName = "Animal"; dataItem2.GroupSortPriority = 2; dataItem2.ParentIndex = 1; items.Add(dataItem2); Item dataItem3 = new Item(3); dataItem3.Name = "Trout"; dataItem3.GroupName = "Fish"; dataItem3.GroupSortPriority = 1; items.Add(dataItem3); radGridView1.Relations.AddSelfReference(radGridView1.MasterTemplate, "Index", "ParentIndex"); radGridView1.DataSource = items; } public class Item { public Item(int index) { Index = index; } public int Index { get; private set; } public int ParentIndex { get; set; } public string Name { get; set; } public string GroupName { get; set; } public int GroupSortPriority { get; set; } } public class GridGroupComparer : IComparer<Group<GridViewRowInfo>> { public GridGroupComparer() { } public int Compare( Group<GridViewRowInfo> x, Group<GridViewRowInfo> y) { if (null == x.Key || null == y.Key) return 1; GridViewRowInfo xGridViewRowInfo = x.DefaultIfEmpty(null).First(); GridViewRowInfo yGridViewRowInfo = y.DefaultIfEmpty(null).First(); if (null == xGridViewRowInfo || null == yGridViewRowInfo) return x.Key.GetHashCode().CompareTo(y.Key.GetHashCode()); Item xGridRowDataItem = xGridViewRowInfo.DataBoundItem as Item; Item yGridRowDataItem = yGridViewRowInfo.DataBoundItem as Item; if (null == xGridRowDataItem || null == yGridRowDataItem) return x.Key.GetHashCode().CompareTo(y.Key.GetHashCode()); if (xGridRowDataItem.GroupSortPriority > yGridRowDataItem.GroupSortPriority) return 1; if (xGridRowDataItem.GroupSortPriority < yGridRowDataItem.GroupSortPriority) return -1; return 0; } } private void Form1_Load(object sender, EventArgs e) { GridGroupComparer groupComparer = new GridGroupComparer(); radGridView1.MasterTemplate.GroupComparer = groupComparer; GroupDescriptor descriptor = new GroupDescriptor(); descriptor.GroupNames.Add("GroupName", ListSortDirection.Ascending); radGridView1.GroupDescriptors.Add(descriptor); } If you remove the Self-referencing hierarchy, you will notice that the GroupComparer is respected.