VB.NET で shared というのは、C# や C++ でいうところの static メンバーです。なので、これはインスタンスには無関係ということになります。
【逆にsharedが駄目だと内部クラスのメソッドすら呼べませんよね?】
インスタンス化すれば呼べますよ。
Public Class Form1
Private Class Sample
Dim a As Integer
Public Sub Test()
a = a + 1
End Sub
End Class
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x As Sample
x = New Sample 'インスタンス化
x.Test()
End Sub
End Class
逆に、インスタンス化していないのに呼び出せている時点で、それは単なる名前空間+外部変数(static変数)の様相を呈しているということです。
それで困っていなければ構いません。そういう応用だということで、何も問題なし。
けれども、そのクラスでインスタンスを複数持ちたいという場面がある時、shared ではまったく対応できないということです。
上のコード例で言えば、
Dim x As Sample
Dim y As Sample
x = New Sample
y = New Sample
とすれば、Sample クラスのインスタンスが二つ(x と y)できました。それで、x.Test() とか、 y.Test() とかいうようにして、インスタンスごとのメソッドを呼び出すという使い方になります。そしてもちろん、メンバー変数の a も、インスタンスごとに存在する。つまり、x.a、y.a ということで別の存在。
Shared の場合は Sample.Method とか、Sample.n とかいう形で、そこにはインスタンスの区別がまったく無いわけです。
なお、繰り返しになりますが、それで良ければ何も問題なし。不都合が無ければ、Sharedのままで構いません。
◆◆◆◆◆◆ 補足を拝見しました ◆◆◆◆◆◆
【内部のクラスから上位クラスのメソッドはどう参照するんでしょうか?メソッドはprivateです。 】
内部クラスを次のように定義したとします。ここで、Form1 は上位クラスです。
Private Class Sample
Public Sub Test(ByVal x As Form1)
x.Alpha()
End Sub
End Class
これを上位クラスから呼び出します。
Dim x As Sample = New Sample
x.Test(Me)
自身のインスタンスを渡します。この時、Me というキーワードを使います。これは C# や C++ だと this です。
内部クラス側は、このインスタンスを使って Alpha という上位クラスのメソッドを呼び出します。Alpha メソッドは private で構いません。
参考になりましたでしょうか?