More like:
var resultantList = sigList
.Select((x,i) => new {Item=x,Index=i})
.GroupBy(a => string.IsNullOrEmpty(a.Item.SignalGroup)?a.Index.ToString():a.Item.SignalGroup)
.Select(grp => grp.Select(a=>a.Item).ToList());
Let me break it down:
You want to have each empty string in it's own group (not excluded like the first solution). The easiest way to do that is to group by something unique, such as the index. You can map the index using the Select extension:
.Select((x,i) => new {Item=x,Index=i})
This will return an anonymous class with Item and Index as Parameters
We still want the other items to group by their own SignalGroup. I hope that these won't be ints so you won't get any random mis-groupings. We can group by the SignalGroup if there is one, or the unique index if there isn't:
.GroupBy(a => string.IsNullOrEmpty(a.Item.SignalGroup)?a.Index.ToString():a.Item.SignalGroup)
Now we just need to select out the original item from the anonymous class. We can do this using the select extension for each item within the group:
.Select(grp => grp.Select(a=>a.Item).ToList());
That should be spot on what you asked for ^_^
UPDATE
Ooh - I forgot that you can specify the items to be grouped in the groupby:
.GroupBy(a => string.IsNullOrEmpty(a.Item.SignalGroup)?a.Index.ToString():a.Item.SignalGroup, a=>a.Item)
Then you don't need to select out the items in the last step:
.Select(grp => grp.ToList());
Either way is fine