Since I didn't see much out there (C#, SDK 2.1) on manipulating grouplayer, specifically removing them from the TOC if empty; here is an example. Function "removes unchecked layers in the TOC" through a series of steps.
private async Task X_TOC_lyrs()
{
await ActMap();//mapview.active.map checker
//Removes group-level layers that are unchecked, at once
IReadOnlyCollection<Layer> dlayers = MapView.Active.Map.Layers.Where(l => l.IsVisible == false).ToList();
await QueuedTask.Run(() => MapView.Active.Map.RemoveLayers(dlayers));
//Removes subgroup-level layers that are unchecked, one-by-one
IEnumerable<Layer> dlayers2 = MapView.Active.Map.GetLayersAsFlattenedList().Where(l => l.IsVisible == false).ToList();
foreach (var dlyr in dlayers2)
{
await QueuedTask.Run(() => MapView.Active.Map.RemoveLayer(dlyr));
}
//Remove empty groups
IReadOnlyList<GroupLayer> glayers = MapView.Active.Map.Layers.OfType<GroupLayer>().ToList();
foreach (var lyr in glayers)
{
if(lyr.Layers.Count == 0)
{
await QueuedTask.Run(() => MapView.Active.Map.RemoveLayer(lyr));
}
}
}