I think there are two problems. The first is that you need to call overload CreateDelegate, which takes three arguments. The optional argument indicates the instance on which the method should be called.
, Converter<'T, unit> , Microsoft.FSharp.Core.Unit, , void. , , . , #, void :
open System
type Wrapper<'T>(f:'T -> unit) =
member x.Invoke(a:'T) = f a
let makeAction (typ:Type) (f:'T -> unit) =
let actionType = typedefof<Action<_>>.MakeGenericType(typ)
let wrapperType = typedefof<Wrapper<_>>.MakeGenericType(typ)
let wrapped = Wrapper<_>(f)
Delegate.CreateDelegate(actionType, wrapped, wrapped.GetType().GetMethod("Invoke"))
makeAction (typeof<int>) (printfn "%d")
. ( ).