When implementing the strategy pattern I believe the more versatile approach is an implementation using the mediator and service locator patterns.
It solves the problems I mentioned in a comment on the Part 1 article while ensure everything is properly strongly typed without using dictionaries.
Let me try to exemplify (writing from my phone, may have some inconsistencies).
First you create IXptoStrategy<TParam> where TParam : IXptoStrategyParam that will have some Execute method that receives the TParam and returns some common result class, and you define for each strategy it's TParam and an implementation. You register everything on the DI container by the IXptoStrategy<TParam> interface and now you create a IXptoStrategyService that has a generic Execute<TParam> method and the implementation will resolve from the DI the IXptoStrategy<TParam> and execute it.
Not only this approach prevents the initialization of unnecessary strategies, it also ensures the parameters are properly strong typed.
In reality this is just a specialization of a CQRS pattern: https://medium.com/swlh/mediator-pattern-in-asp-net-core-applications-109b4231c0f8