Reducing nested while statements for building a grid?
There is a fair amount of common code that can be extracted into a function.

There is a common check in the while clause and the if clause.

boolean CanAdd(LargeContentBlock largeContentBlock, ShapeList shapes)
{
    return largeContentBlock.CanAddBlock(shapes.Peek().Size)
                &amp;&amp; !largeContentBlock.Complete;
}


The two inner while loops are doing the same thing, just with two different lists. This is a perfect instance to abstracting the common code into a function.

void AddContent(LargeContentBlock largeContentBlock, ShapeList shapes)
{
    while (shapes.Any() &amp;&amp; CanAdd(largeContentBlock, shapes))
    {
        largeContentBlock.Add(shapes.Pop());
    }
}


Now your code looks like:

var largeContentBlock = new LargeContentBlock();

while (!largeContentBlock.Complete &amp;&amp; aggregatePageFeed.ShapeList3.Any())
{
    AddContent(largeContentBlock, aggregatePageFeed.ShapeList1);
    AddContent(largeContentBlock, aggregatePageFeed.ShapeList2);

    if (CanAdd(largeContentBlock, aggregatePageFeed.ShapeList3))
        largeContentBlock.Add(aggregatePageFeed.ShapeList3.Pop());
}

return largeContentBlock;