Allocating/Deallocating memory is a pretty expensive thing to do. However, with C# the garbage collector is going to decide what to end up doing with your memory once there are no longer any references to it. It still isn't a good idea to give the garbage collector any excuse to start up and begin sifting through your 'trash'.
Ideally, instead of 'deleting' the enemy once it's dead, have your enemies have a bool variable saying whether they're active or not. If the enemy is dead, it isn't active. If the enemy isn't active then you can skip physics, rendering, etc... on that particular enemy during your update loop.
Then, when you want to spawn new enemies, you can flag the deactivated enemy as active again and re-initialize the enemy to default stats (back to full health, etc...).
It's a bit of a balancing act though since it's not really practical to have everything in your game pre-allocated and always sitting in memory. If you're going to be creating/deleting something quite often, however, you should focus on keeping that in memory as long as possible otherwise you're going to be making your garbage collector work overtime.
For something like enemies, however, you might want to consider a different solution. I don't mean to add to the pile of answers you've already gotten but I'm going to go ahead and add to the pile of answers you've already gotten:
If you find yourself creating and destroying enemies pretty rapidly (conceptually not hard to imagine on my part). Consider creating a pool of enemies of some large-enough size to hold all the enemies that can be on the screen at one time + some margin of error. Then, any time you need an enemy, grab something from that pool, initialize it as a new enemy, and use it until you no longer need it. Once it is killed, return it to the enemy pool to be used again. These don't depend on the garbage collector so you don't find yourself in this strange position of wondering if they're "truly" dead. They're not, but that ends up being a good thing.
Ok great, so essentially once i create an enemy and only reference that from a list it does get cleaned up eventually once kicked out of the list.
Very good idea to keep a list as a pool, just flag a bool for the status of the enemy and stop interacting with those. Once a new enemy gets created i use one of the free spots or one with the dead flag.
Thanks for the link, i'll read it. I believe Shawn has created one in his blog too, guess i am going to read that too.