So step one would be to make a tile renderer app. Something capable of positioning SharpMap at chosen locations (and specified width and height) and then rendering the map to file. This way you create tiles.
//create a map of the size of your tiles
var map = new SharpMap.Map(new Size(tileSize, tileSize));
//add layersm providers etc...
//then loop through world coordinates at intervals of your tileSize calling
map.Center = new SharpMap.Geometries.Point(centerX, centerY);
var bitmap = (Bitmap)map.GetMap();
//save bitmap to disc
//save spatial coordinates and filename to db
Once you've done that you can either repeat the procedure at various zoom levels or simply join up images yourself (use 4 images to create 1 image at the higher zoom level).
I suggest you use distinct directories for each layer and transparent background. This way you can later join up various layers.
Also think about using a naming scheme that will spread the tiles into various subdirectories so you avoid problems with having one large directory of images.
Then it is a simple matter of creating a service that will return requested images at certain coordinates. To simplify matters I'm using my own coordinate system for the tiles (so 0,0,0 is the first tile on the first zoom level. The service then uses db
to find the file (or perhaps use the same naming scheme used by the generator!) and returns an image. The final step is to make a MapsUI tile provider that will call this service...