Refactoring this legacy application to a cleaner state (continued)
you should move 

child.Children.Add(grandChild);


outside of your if statements like so:

    foreach (var item in gmcListItems)
    {
        var customerReport = (CustomerReport) item.dataObject;
        var grandChild = AssembleGrandChild(child, customerReport);
        if (item.value.Equals(initialReportType))
        {
            if (!item.key.Equals(initialCrs))
            {
                initialCrs = item.key;
                parent.Children.Add(child);
                child = AssembleNode(item.key, parent);
            }
        }
        else
        {
            initialReportType = item.value;
            initialCrs = item.key;
            parent.Children.Add(child);
            nodes.Add(parent);
            parent = AssembleNode(item.value);
            child = AssembleNode(item.key, parent);
            grandChild = AssembleGrandChild(child, customerReport);
        }
        child.Children.Add(grandChild); // &lt;--
    }
    parent.Children.Add(child);
    nodes.Add(parent);


Otherwise you are going to have a whole lot of duplicates.