Thanks to @Jason Stangroome for his original blog post and pointing me towards the InvokeMethod activity. With the help of the excellent WCF & WF Samples for .NET 4, I updated the XAML like this:
<Sequence DisplayName="Queue chained build" sap:VirtualizedContainerService.HintSize="222,146">
<Sequence.Variables>
<Variable x:TypeArguments="mtbc:IBuildDefinition" Default="[BuildServer.GetBuildDefinition(BuildDetail.TeamProject, buildChainItem)]" Name="ChainedBuildDefinition" />
<Variable x:TypeArguments="mtbc:IBuildRequest" Default="[BuildServer.CreateBuildRequest(ChainedBuildDefinition.Uri)]" Name="ChainedBuildRequest" />
<Variable x:TypeArguments="x:String" Default="[ChainedBuildRequest.ProcessParameters]" Name="NextBuildProcessParameters" />
<Variable x:TypeArguments="scg:IDictionary(x:String, x:Object)" Default="[WorkflowHelpers.DeserializeProcessParameters(NextBuildProcessParameters)]" Name="DeserializedParameters" />
<Variable x:TypeArguments="mtbc:IQueuedBuild" Name="QueuedChainedBuild" />
</Sequence.Variables>
<sap:WorkflowViewStateService.ViewState>
<scg:Dictionary x:TypeArguments="x:String, x:Object">
<x:Boolean x:Key="IsExpanded">True</x:Boolean>
</scg:Dictionary>
</sap:WorkflowViewStateService.ViewState>
<InvokeMethod DisplayName="Add current build number to ProcessParameters" sap:VirtualizedContainerService.HintSize="299.663333333333,127.553333333333" MethodName="Add">
<InvokeMethod.TargetObject>
<InArgument x:TypeArguments="scg:IDictionary(x:String, x:Object)">[DeserializedParameters]</InArgument>
</InvokeMethod.TargetObject>
<InArgument x:TypeArguments="x:String">["ParentBuildNumber"]</InArgument>
<InArgument x:TypeArguments="x:Object">[BuildDetail.BuildNumber]</InArgument>
</InvokeMethod>
<InvokeMethod DisplayName="Re-serialize ProcessParameters" sap:VirtualizedContainerService.HintSize="299.663333333333,127.553333333333" MethodName="SerializeProcessParameters" TargetType="mtbw:WorkflowHelpers">
<InvokeMethod.Result>
<OutArgument x:TypeArguments="x:String">[ChainedBuildRequest.ProcessParameters]</OutArgument>
</InvokeMethod.Result>
<InArgument x:TypeArguments="scg:IDictionary(x:String, x:Object)">[DeserializedParameters]</InArgument>
</InvokeMethod>
<InvokeMethod DisplayName="Queue Next Build" sap:VirtualizedContainerService.HintSize="299.663333333333,127.553333333333" MethodName="QueueBuild">
<InvokeMethod.Result>
<OutArgument x:TypeArguments="mtbc:IQueuedBuild">[QueuedChainedBuild]</OutArgument>
</InvokeMethod.Result>
<InvokeMethod.TargetObject>
<InArgument x:TypeArguments="mtbc:IBuildServer">[BuildServer]</InArgument>
</InvokeMethod.TargetObject>
<InArgument x:TypeArguments="mtbc:IBuildRequest">[ChainedBuildRequest]</InArgument>
</InvokeMethod>
<mtbwa:WriteBuildMessage sap:VirtualizedContainerService.HintSize="200,22" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" Message="[String.Format("Queued chained build '{0}'", buildChainItem)]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" />
</Sequence>