Для больших данных в программировании Windows C #, будь то в WPF или WinForms, я традиционно добавляю узлы динамически. Я загружаю начальный корень дерева + детей + внуков глубоко. Когда какой-либо узел раскрывается, я загружаю узлы дерева, которые будут представлять внуков расширяющегося узла, если таковые имеются.
Этот шаблон также хорошо работает с поиском данных. Если вы действительно загружаете данные из источника тысяч или миллионов записей, вы, вероятно, не хотите загружать их все сразу. Никто из пользователей не хочет ждать загрузки, и нет причин загружать данные, которые никогда не будут просмотрены.
Обычно я загружал данные узлов внуков или правнуков по мере необходимости в фоновый поток, затем перенаправлял эти данные обратно в поток пользовательского интерфейса, создавал и добавлял узлы. Это оставляет интерфейс отзывчивым. Вы можете визуально декорировать узлы дерева, чтобы указать, что они все еще загружаются для случая, когда пользователь опережает ваш ввод-вывод в хранилище данных.