If your design is to have such a method, the method is “valid”. Now if it is a good idea depends on how you intend to solve the problem with your design.
You can render a simple 2D wire-frame scene by rendering each shape of a collection one after the other. But the problem here is the separation of concerns: now all your shapes are coupled to your graphic library. If you change library, and perhaps even platform, you’ll have a huge work.
A more evolutive way could be to use the bridge pattern: your shape abstraction stays uncorrupted by your graphic environment. It relies on an implementation layer that can evolve independently to the shapes. Each method of the abstraction invokes one or several low level methods of the implementor.
Note that I wrote “more evolutive”. Not “better”. It’s a question of balance: I want evolutivity, it’ll cost me some complexity. There is no free lunch.
Now, back to your question: maybe there’s a deeper conceptual problem. For example you may want the renderer to decide which shape to draw and which part is hidden. In this case, the current rendering design would be insufficient. In this case you may need a
Renderer object that interacts with the shapes. Maybe it’s even a combination of both, with a shape abstraction having a shape implementor that acts as a proxy in a colection owned by the
There a plenty of ways this can be modeled. We can’t tell what’s best. If you tell more, we can help you find what’s most suitable.