לאחר הרבה ניסיונות מצאתי בס"ד את הדרך ליישם את זה, אני שם את זה פה אם למישהו זה יהיה שימושי בעתיד.
א. הוספתי מחלקת עזר שתייצר ממשקי COM כדלהלן:
public static partial class ComActivator
{
    [LibraryImport("ole32")]
    private static partial int CoCreateInstance(
        ref Guid clsid,
        nint pUnkOuter,
        int dwClsContext,
        ref Guid iid,
        [MarshalAs(UnmanagedType.Interface)] out object pObj
    );
    public static TInterface ActivateClass<TInterface>(Guid clsid, Guid iid)
    {
        Debug.Assert(iid == typeof(TInterface).GUID);
        var hResult = CoCreateInstance(ref clsid, default, 1, ref iid, out var obj);
        if (hResult < 0)
        {
            Marshal.ThrowExceptionForHR(hResult);
        }
        return (TInterface)obj;
    }
}
ב. למחלקה ITaskbarList3 הוספתי את התכונה GeneratedComInterface
ג. ככה אני מקבל את האובייקט:
var clsid = Guid.Parse("56FDF344-FD6D-11D0-958A-006097C9A090"); // TaskBarList
var iid = Guid.Parse("EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF"); // ITaskBarList3
var taskbar = ComActivator.ActivateClass<ITaskbarList3>(clsid, iid);
קישור שעזר לי: https://learn.microsoft.com/en-us/dotnet/standard/native-interop/tutorial-comwrappers
נ.ב. מצאתי עוד פתרון עם ComWrappers אבל הפתרון הראשון עובד מצויין אז השתמשתי בו.