In fact, the techniques for C# here would be pretty much the same as for C++ or C: Don't do dynamic allocation in the hot path. And if you must, keep the lifetime short so it gets cleaned up predictably (usually in gen0).
However, for an ancient platform on modern hardware I guess the per-frame budget is plentiful even for an emulator.