You could certainly make it harder on yourself by malloc-ing each Shape individually and storing those pointers in a dynamic array. Using a language like C# ... would force that allocation structure.
What's stopping you from using a fixed array of structs in C#, just as the author has done in C?