I haven't fully looked through your code, but why bother having a separate variable tracking the number of bullets? Why not use List<>.Count()?
I think what might be happening is that you are checking the .Count in your for loop, then because you are altering that by removing bullets as you loop through, it's going to mess things up.
EDIT: One way around this is to add a property to your bullets so that you can mark them as being being drawn or not. Then, when you are looping through to draw your bullets you check the property. Another way to do this is to make a list of the bullets that need to be removed, and remove them from the list. Something like:
List<Bullet> offscreenBullets = new List();foreach(Bullet bullet in BulletList){ //check visibility here if(bullet.Pos.X < rGameScreen.X || bullet.Pos.Y < rGameScreen.Y) offscreenBullets.Add(bullet);}//remove the off screen bulletsforeach(Bullet bullet in offscreenBullets){ BulletList.Remove(bullet);}
Perhaps not the most efficient way of doing things, but whatever.
EDIT 2: My personal preference would lean toward having a class that represents a bullet, and have a property on it that says if it is visible or not. Then, in your update function you set if it is visible or not and in your Draw() function you only draw visible bullets.
[Edited by - Moe on June 4, 2009 3:36:10 PM]