A series of pre-defined sprites, per base, is a reasonable and simple approach.
A more dynamic approach that reflects the damage to each base on a per-pixel can be accomplished via a mask. The mask is a simple bit map corresponding to the base sprite. 0 for an invisible pixel, 1 for a visible one. Initially the mask would look like a blacked-out version of the base. For example, with crude ASCII art:
11100111 ### ###
When you render, you use both the mask and the real sprite and you skip drawing any pixels of the sprite where the mask is 0. In the old days we'd do this with bitwise magic prior to blitting the sprite; on modern platforms you'd probably accomplish this by multiplying the mask's color with the sprite's color.
Whenever a base takes a hit, you update the mask by:
- determine which horizontal column of the base was hit
- set the first non-zero bit in that column to 0 (starting from the top)
This will give you a per-pixel degradation of the base as it takes damage.