First I should say that this stuff is pretty tricky ... so unless you're super motivated I'd just stick to your original plan. Evolutionary algorithms are one of those ideas that seems really powerful, but hasn't really resulted in anything significant yet.
With that out of the way ... there's two main ways to proceed...

If you use a single string to represent your ships genome, e.g., "AAABBBABCFG" then mutation and crossover are simple: for mutation either add a symbol, delete a symbol, or change a symbol. For crossover (where two parents are mixed), just cut the parent strings in half and join the different halves together. The problem with the string-based representation is coming up with the string->ship mapping (e.g., how does "ADBFG" get turned into a ship?)
The other way to do it is to have a higher-level representation. For example you could have modules like "Engine" and "Gun" and relationships like "Attach" and "Mirror". The modules would then be connected in a graph. This is what Sims did with Evolved Creatures. The tricky bit then implementing cross-over and mutation.
If I were to do it, I'd probably use the string representation. The encoding part can be done in different ways. One way is to map each symbol to a property (as you've pointed out.) So the string "253" might mean: build a ship with 2 guns of size 5x3. The other way, is to map each symbol to a
building instruction: e.g., "ABGC" might mean map to: "A": make a 2x3 box, "B": select the top-most boxes, "G" add guns to all selected boxes, "C" take the current design, translate it by 3 units, and then mirror it, etc ...
The benefit of the instruction-based mapping is that if you let the string length change, you can evolve more and more complex designs. At least that's the theory, in practise it's going to be tricky. But .... if you can pull it off, I think it would be a crazy addition.
Whoops, I think I just derailed this thread...
