It's easier to just use a closure instead of trying to deal with passing the value as a parameter:
public static void Execute<TValue, TResult>(Func<TValue, TResult> fc)
where TValue : BackgroundExecutionContext
where TResult : BackgroundExecutionResult
{
var bw = new BackgroundWorker();
bw.DoWork += (_, args) =>
{
BackgroundExecutionContext context = GetContext(); //or however you want to get your context
var result = fc(context); //call the actual function
DoStuffWithResult(result); //replace with whatever you want to do with the result
};
bw.RunWorkerAsync();
}