Question: Is there a way to override the ToString() method on the Shape class, without inheriting from it and doing it in the the inherited class? So whenever I call any of the shapes' to string method I get the overriden one?

Note I don't want to this:
Shpae1: Shape
override ....

The reason why I wan't to do this, is I have a lot of shapes in my project already, ellipses, rectangles etc (the generic ones). I want to print the location of each shape, I Know I could to a separate function taking a shape as an arg, but I have some code already there that uses the to string of a shape, so I thought it would be more elegant if I could just change the toString method so I won't have to change any of my code.

Answer: 
I don't think that this is possible (also there might be some dirty reflection tricks involving dynamic code generation etc.)

The main ways to extend an existing class like `Shape` are:

1. **Inherit**. This is not possible because you use `Rectangle`, `Ellipse` etc. which are sealed.
2. **Partial class**. Does not work because .NET does not provide `Shape`, `Rectangle`, etc. as partial classes.
3. **Extension method**. Would be the most elegant solution but does not work either because extension methods are only used if the class does not provide the method itself. And `ToString()` is provided in `System.Object` that every class inherits from, so technically `Shape`, `Rectangle`, etc. have a `ToString()` method, even if they do not override them themselves.

So i would consider one of the two options:

* Create a static method `string GetStringInfo(Shape s)` in a utility class that takes a `Shape` and returns the string, then use this function everywhere you use `ToString()` on a `Shape`.
* To minimize refactoring, create an extension method `string GetStringInfo()` on type `Shape` and refactor your code to use this method instead of `ToString()`

If anyone knows another working solution, I'd be interested in that, too.
No; you can't do that.

Instead, you should probably use a DataTemplate.