.NET Fiddle

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
					
public class Program
{
	public static void Main()
	{
		var executor = new ConverterExecutor();
		executor.RegisterConverter(new DestinationConverter());
		
		var result = executor.ConvertMultiple(new List<SharedBaseClass>{new InputClass()});
		Console.WriteLine(result.First());
	}
}

public class SharedBaseClass {}

public class DestinationClass : SharedBaseClass {
	public DestinationClass(){}
}

public class InputClass : SharedBaseClass {
	public InputClass(){}
}

public interface IConverter<out TU, T> where TU : SharedBaseClass where T: SharedBaseClass
{
	public TU Convert(T input);
}

public class DestinationConverter: IConverter<DestinationClass, InputClass> {
	public DestinationClass Convert(InputClass input) {
		return new DestinationClass();
	}
}

public class ConverterExecutor
{
	private readonly Dictionary<Type, Func<SharedBaseClass, SharedBaseClass>> _converters = new();
	
	public void RegisterConverter<TU, T>(IConverter<TU, T> converter) where TU : SharedBaseClass where T : SharedBaseClass
	{
		_converters[typeof(T)] = x => converter.Convert((T)x);	
	}
	
	public IEnumerable<SharedBaseClass> ConvertMultiple(IEnumerable<SharedBaseClass> classesToConvert)
	{
		var converted = new List<SharedBaseClass>();
		
		foreach(var toConvert in classesToConvert)
		{
			_converters.TryGetValue(toConvert.GetType(), out var converter);
			
			if (converter != null) {
				converted.Add(converter(toConvert));
				continue;
			}
							  
			converted.Add(toConvert);
		}
		
		return converted;
	}
}
;