I had the need recently to split up a List of objects (2.5 million rows) into smaller lists so I could batch insert into a database. I stumbled on this method, and it's lightning fast for splitting large lists into smaller chunks of whatever size you want.

public static List<List<object>> SplitList(List<object> locations, int nSize = 30)
{
            List<List<object>> list = new List<List<object>>();
            for (int i = 0; i < locations.Count; i += nSize)
            {
                list.Add(locations.GetRange(i, Math.Min(nSize, locations.Count - i)));
            }
            return list;
}