Communicating events between entity components with minimal code overhead
You have one big problem with this design. It's easiest to explain the problem with the example. 

So, let's say you add a new feature where you can issue a speak message. You'll need to add SpeakMessage and SpeakComponent classes. SpeakComponent would have public void Message(SpeakMessage message) method. 

In this scenario, when someone calls your IssueMovement method, it will call SendMessage method which in turn will iterate over _components (which now contains MoveComponent and SpeakComponent) and try to call their Message method that has one argument of type MovementMessage. Since SpeakComponent doesn't have that method, it will throw an exception. The only way to avoid that with your current design is to have your component classes each handle every message in the system which is not what you would want to do.

So, to improve your design, your entity will need to know which component handles which message. The best way to do it, IMO, is to have an interface IMessageComponent&lt;T&gt; where T: IComponentMessage with a single method void Message(T componentMessage). MoveComponent would then implement IMessageComponent&lt;MoveMessage&gt; and SpeakComponent would implement IMessageComponent&lt;SpeakMessage&gt;. 

Your SendMessage method inside the entity would then become:

public void SendMessage&lt;T&gt;(T message) {
  _components.OfType&lt;IMessageComponent&lt;T&gt;&gt;().ForEach(x =&gt; x.Message(message));
}


If you want one component to handle more than one message type (although, that would violate SRP), your component could implement multiple IMessageComponent&lt;T&gt; interfaces with different message classes.