como gerar código HTML dinamicamente usando o WebBrowser do .NET ou mshtml.HTMLDocument?

A maioria das respostas que li sobre esse assunto aponta para a classe System.Windows.Forms.WebBrowser ou a interface COM mshtml.HTMLDocument do assembly Microsoft HTML Object Library.

A classe WebBrowser não me levou a lugar algum. O código a seguir falha ao recuperar o código HTML conforme processado pelo meu navegador da web:

[STAThread]
public static void Main()
{
    WebBrowser wb = new WebBrowser();
    wb.Navigate("https://www.google.com/#q=where+am+i");

    wb.DocumentCompleted += delegate(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)wb.Document.DomDocument;
        foreach (IHTMLElement element in doc.all)
        {
                    System.Diagnostics.Debug.WriteLine(element.outerHTML);
        }     
    };
    Form f = new Form();
    f.Controls.Add(wb);
    Application.Run(f);
} 

O acima é apenas um exemplo. Não estou realmente interessado em encontrar uma solução alternativa para descobrir o nome da cidade onde estou localizado. Eu só preciso entender como recuperar esse tipo de dados gerados dinamicamente programaticamente.

(Ligue para o novo System.Net.WebClient.DownloadString ("https://www.google.com/#q=where+am+i"), salve o texto resultante em algum lugar, procure o nome da cidade em que você está localizado e informe-me se conseguiu encontrá-lo.)

Mas ainda assim, quando eu acesso "https://www.google.com/#q=where+am+i"no navegador da web (ou no firefox), vejo o nome da minha cidade escrito na página da Web. No Firefox, se clicar com o botão direito do mouse no nome da cidade e selecionar" Inspecionar elemento (Q) ", vejo claramente o nome da cidade escrita no código HTML, que parece bastante diferente do HTML bruto retornado pelo WebClient.

Depois que me cansei de jogar o System.Net.WebBrowser, decidi dar uma chance ao mshtml.HTMLDocument, apenas para terminar com o mesmo HTML bruto e inútil:

public static void Main()
{
    mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)new mshtml.HTMLDocument();
    doc.write(new System.Net.WebClient().DownloadString("https://www.google.com/#q=where+am+i"));

    foreach (IHTMLElement e in doc.all)
    {
            System.Diagnostics.Debug.WriteLine(e.outerHTML);
    }
} 

Suponho que deve haver uma maneira elegante de obter esse tipo de informação. No momento, tudo o que consigo pensar é adicionar um controle WebBrowser a um formulário, navegar para o URL em questão, enviar as chaves "CLRL, A" e copiar o que for exibido na página para a área de transferência e tentar analisá-lo. Essa é uma solução horrível, no entanto.

questionAnswers(2)

yourAnswerToTheQuestion