¿Cómo generar dinámicamente código HTML usando WebBrowser o mshtml.HTMLDocument de .NET?

La mayoría de las respuestas que he leído sobre este tema apuntan a la clase System.Windows.Forms.WebBrowser o la interfaz COM mshtml.HTMLDocument del ensamblaje de la Biblioteca de objetos HTML de Microsoft.

La clase WebBrowser no me llevó a ninguna parte. El siguiente código no puede recuperar el código HTML como lo muestra mi navegador 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);
} 

Lo anterior es solo un ejemplo. No estoy realmente interesado en encontrar una solución para averiguar el nombre de la ciudad donde estoy ubicado. Simplemente necesito entender cómo recuperar ese tipo de datos generados dinámicamente mediante programación.

(Llame al nuevo System.Net.WebClient.DownloadString ("https://www.google.com/#q=where+am+i"), guarde el texto resultante en algún lugar, busque el nombre de la ciudad donde se encuentra actualmente y hágame saber si pudo encontrarlo.

Pero aún cuando accedo "https://www.google.com/#q=where+am+i"Desde mi navegador web (es decir, Firefox) veo el nombre de mi ciudad escrito en la página web. En Firefox, si hago clic derecho en el nombre de la ciudad y selecciono" Inspeccionar elemento (Q) "veo claramente el nombre de la ciudad escrita en el código HTML que se ve bastante diferente del HTML sin procesar que devuelve WebClient.

Después de que me cansé de jugar a System.Net.WebBrowser, decidí darle una oportunidad a mshtml.HTMLDocument, solo para terminar con el mismo HTML simple 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);
    }
} 

Supongo que debe haber una manera elegante de obtener este tipo de información. En este momento, todo lo que puedo pensar es agregar un control WebBrowser a un formulario, hacer que navegue a la URL en cuestión, enviar las claves "CLRL, A" y copiar lo que aparezca en la página al portapapeles e intentar analizarlo Esa es una solución horrible, sin embargo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta