var totalNumberOfItems = 41;
var items = Enumerable.Range(1, totalNumberOfItems).Select(n => $"Item #{n}").ToList();
var nGroups = (int)Math.Ceiling((double)totalNumberOfItems / maxGroupSize);
var fullGroupSize = (int)Math.Ceiling((double)totalNumberOfItems / nGroups);
var deficit = nGroups * fullGroupSize - totalNumberOfItems;
var nFullGroups = nGroups - deficit;
var fullGroupsTotal = nFullGroups * fullGroupSize;
int GroupIndex(int itemIndex) =>
itemIndex < fullGroupsTotal ?
itemIndex / fullGroupSize :
(itemIndex - fullGroupsTotal) / (fullGroupSize - 1) + nFullGroups;
items.Select((item, idx) => (item, groupNo: GroupIndex(idx)))
.GroupBy(pair => pair.groupNo, pair => pair.item)
.Select(g => g.ToList());
foreach (var group in groups)
Console.WriteLine($"[ {string.Join(", ", group)} ] ({group.Count} items)");