After a general arrangement of basic land masses has been laid out across a map, the map should be subdivided into plates. Each plate should then be assigned a vector indicating its translational movement.
|Green and white plates have different movement vectors.|
|Collision! Raise the elevation, like mountains.|
|Spreading - depress the elevation, like in a rift valley.|
|Leave elevation untouched.|
Applying this logic to borders between oceanic plates can yield islands, deep sea trenches, and peninsulas (if adjacent to a land mass). Perhaps the sum of the magnitudes of the vectors could determine how much to alter the elevation.
You may be wondering how to evaluate the cells to see if they're colliding spreading, or sliding along each other. This can be done by treating the cells as squares (or whatever polygons are appropriate), and applying the translational (and optionally, rotational) vector to a copy of the pair of cells being evaluated. If they overlap, collision! This may involve some normalization or scaling of the vectors involved.
Keep in mind I'm just thinking aloud (er, via keyboard and screen and blog post). It may be a I just port the web-based Experilous planet generator to C# and the basic land mass layouts serve as inputs to that, instead. Although now that I think about it, Amit Patel's island generator could probably be modified to incorporate this approach. I have partial port of that lying around somewhere. Something to consider for another day, perhaps. For now, I should sign off and get some sleep before facing whatever new challenges work presents in the morning.