Is there a way to send messages to OLED from a prop?

All of this is possible.
Some of it is easy, but require some minor workarounds.
Doing it “the right way” is a little harder.

First of all, let me explain why what you have doesn’t work.

The problem

  1. The “folder” doesn’t matter. Folders don’t show up in any meaningful way inside the code, so the “display” folder is not a problem.
  2. There are two things called “display” though, one is a namespace, and you do use “display::” to access things that live inside that namespace. The other is an object/instance of the SSD1306Template templated class. Instances are different from namespaces in that they allocate memory in RAM, and exists as an entity at runtime. (namespaces are purely compile time entities.) Accessing member methods/variables of an instance is done like this: “display.SetMessage”.
  3. It turns out though, that the display instance (which is the one we want) may potentially be called something other than “display”, and there may be more than one of them. (Although that is unusual.) Also, for various reasons, the display instance is declared after the prop in the ProffieOS.ino file, so the prop doesn’t actually know about the display instance.

The workaround

We can put a simple function like this somewhere at global level, before the prop:

void display_SetMessage(const char* message);

Now, the in the prop code, we can use this function, even though it’s not defined yet. (It’s declared, but not defined.)

Finally, at some point after the display instance has been insantiated (in ProffieOS.ino) we can define the function:

void display_SetMessage(const char* message) {
   display.SetMessage(message);
}

And then everything will work.

The second problem

While the above works, it probably won’t do what you want if you have a bigger display, two displays, or some other weird configuration. For that reason, I prefer to set it up so that the display choses what messages to display based on the messages it receives rather than having the prop decide.

The right way (maybe)

It’s possible to write your own “display controller” which controls what is shown on the display in much more detail. That is where I imagine stuff like this belongs. Unfortunately there aren’t a lot of examples that shows how to do this, which probably makes it more difficult than the workaround outlined above.