Ok.. en general la idea principal de hacer miembros de tipo static o shared es para poder accesar a los métodos de forma natural sin necesidad de crear instancia, esto con el objeto de poder tener variables, metodos, propiedad, etc, encapsuladas en otro lado que no propiamente actuaran como un objeto.
Por ejemplo, antes en vb6 tu creabas un modulo de clase y declarabas como publica cierto metodo, propiedad, etc, y podías accesar a él desde cualquier parte de tu proyecto, pero como la version en .Net esta 100% orientado a objetos es por eso que se cran clases pero a su vez existen los métodos compartidos precisamente para esa funcionalidad..
Ahora, tal vez te preguntes porque no hacer todo shared, pues el hecho es que cuando creamos nuestras clases es precisamente porque las vamos a ocupar para darle un comportamiento de acuerdo a nuestras necesidades, cosa que forma compartida no puedo hacer.
Es como tener una clase casa, con puertas, ventanas, etc.. pero no tiene color, no tiene ancho, alto, etc... y cuando instancias esa clase casa la conviertes en un objeto donde podrás decidir que color va a llevar, que alto va a tener, que va a pasar cuando abran la puerta (eventos), etc, es decir darle behavior (comportamiento)
Es por eso que hay que hacer una buena abstraccion tanto de tus miembros compartidos como los que serán instanciados.
Espero que con esta explicación me haya dado a entender.
Salu2