на c#?
положи webBrowser на форму, прицепись на всякие обработчики загрузки, и выжидай пока не пройдет некоторое время с момента последнего срабатывания обработчиков загрузки. потом вытягивай innerHTML из document и сохраняй.
точнее не скажу, сейчас под рукой негде экспериментировать. знаю что ничего сложного в доступе к DOM через него нет, да и со слеением за процессами загрузки тоже проблем не было.
как вариант, если точно знаешь структуру сайта который будешь грабить можно подменить исходный HTML еще до рендеринга. в него вставить ссылку на свой JS в котором переопределяешь одну из оригинальных функций вызов которых можно считать маркером окончания загрузки. в переопределенных функциях вызываешь оригинальную а затем через window.external вызываешь метод контейнера(c#) который и сохранит все что нужно.