Let's suppose:
Therefore, the question is how to implement the shapes?
How should I design those shape objects, if I don't want the drawing program to know they can be edited at all?
Currently I am leaning towards the second option. Is there a third option I'm not seeing? What would you advice and why?
If you're going to be exchanging files between programs, or maybe storing them for a long time and loading them later after the program has changed, then you don't just use the default serialization of your working objects, which writes out private fields and breaks when you change them.
In these cases, the data format is part of the objects' interface. It needs to be designed and specified.
Designing a data format is a different job from designing a method calling interface. Your primary considerations are usually things like:
Backwards compatibility: How are you going to ensure that the data you write now will be usable by future programs? This is usually handled by a versioning scheme.
Forwards compatibility: How are you going to ensure that data written by future programs will be as usable as possible by Today's programs? This is usually handled by an extension mechanism.
Language independence: Do you need to make sure that programs to process the data are easy/convenient to write in other programming languages? This usually means you don't rely on complicated serialization formats that are defined by your language or libraries.
Text, binary, or in between?: Textual formats (often based on JSON, YAML or XML) are convenient for debugging and easy to document. Binary formats are more compact. Sometimes you can use a middle ground. MS Office files, for example, are text files packaged up in a .zip archive.