The core of your problem is that you're creating a new runspace, which won't have your cmdlets loaded. This is something you should avoid, because it eats up a lot of memory, and creates a lot of problems in trying to synchronize the two runspaces.
The trick is to use a Pipeline. Declare a private field of type Pipeline, then, in your BeginProcessing, add:
pipeline = Runspace.DefaultRunspace.CreateNestedPipeline();
Please dispose of the nested pipeline in EndProcessing.
In processrecord, your code should remain almost the same.