L'ho fatto per una sola pagina (di entrata) in un applicativo più grande, e funzionava.

C'erano 4 file .resx:

- stringhe.en.resx
- stringhe.en-US.resx
- stringhe.it.resx
- stringhe.it-IT.resx

(Cioè file risorse per l'inglese generico, per l'inglese che si parla negli US, per l'italiano generico, per l'italiano che si parla in Italia)

La pagina era così:

ASPX
codice:
<%@ Page Language="vb" etc %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
	<HEAD>
		<title>Seleziona una lingua</title>
	</HEAD>
	<body bgcolor="#E8F404">
		<form id="Form1" method="post" runat="server">
			<asp: DropDownList AutoPostBack=True id="DropDownCulture" runat="server"></asp: DropDownList>
			

</p>
			<hr>
			

</p>
			<h1 id="h1" runat=server></h1>
			<h2 id="h2" runat=server></h2>
			<input id="btn" type=button runat=server onserverclick="btVai_Click">
			<hr>
			Lingua iniziale:<asp:Label id="linguaUtente" Runat=server></asp:Label>		
		</form>
	</body>
</HTML>
VB
codice:
Imports System.Globalization
Imports System.Threading
Imports System.Resources

Public Class NOMEPAGINA
    Inherits System.Web.UI.Page

    Protected GestoreRisorse As New ResourceManager("NOMESOLUZIONE.stringhe", GetType(NOMECLASSEPAGINA).Assembly)

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Inserire qui il codice utente necessario per inizializzare la pagina
        If Not IsPostBack Then
            linguaUtente.Text = Request.UserLanguages(0)

            For Each cultura As CultureInfo In CultureInfo.GetCultures(CultureTypes.SpecificCultures)
                DropDownCulture.Items.Add(New ListItem(cultura.EnglishName, cultura.Name))
                If cultura.Name = Thread.CurrentThread.CurrentCulture.Name Then
                    DropDownCulture.SelectedIndex = DropDownCulture.Items.Count - 1
                End If
            Next
        End If
    End Sub

    Private Sub Page_PreRender(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles MyBase.PreRender
        Response.Write("LINGUA CORRENTE:<font color=red>" & UCase(Thread.CurrentThread.CurrentCulture.NativeName) & "</font>
")
        Response.Write("LE DATE SARANNO:<font color=red>" & DateTime.Now.ToString("F") & "</font>
")
        Response.Write("GLI IMPORTI SARANNO (C):<font color=red>" & 1234567890.ToString("C") & "</font>
")
        Response.Write("GLI IMPORTI SARANNO (N):<font color=red>" & 1234567890.ToString("N") & "</font>
")

        h1.InnerHtml = GestoreRisorse.GetString("NOMECLASSEPAGINA.h1")
        h2.InnerHtml = GestoreRisorse.GetString("NOMECLASSEPAGINA.h2")
        btn.Value = GestoreRisorse.GetString("NOMECLASSEPAGINA.btn")
    End Sub

    Private Sub DropDownCulture_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DropDownCulture.SelectedIndexChanged
        ' Cambia lingua per il thread corrente
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(DropDownCulture.SelectedItem.Value)
        Thread.CurrentThread.CurrentUICulture = New CultureInfo(DropDownCulture.SelectedItem.Value)
    End Sub

    Public Sub btVai_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btVai.Click
        Response.Redirect("paginaMain.aspx")
    End Sub
Nei .resx c'erano gli ID:

NOMECLASSEPAGINA.h1
NOMECLASSEPAGINA.h2
NOMECLASSEPAGINA.btn

Ognuno con le stringhe in linguaggio diverso per il titolo (h1), il sottotitolo (h2) ed il testo del bottone (btn).

Ovviamente NOMECLASSEPAGINA e NOMESOLUZIONE li ho inseriti come nome generico.