For animations to work, you need to have Motor6Ds and part names explicitly the same. In your case, LMR needs to become Left Shoulder, for example. Animations are hard-coded internally to associate a CFrame to a Motor6D name. I believe hierarchy also matters, which means the motors need to be under a Torso part rather than in each arm. Don’t know the accuracy of that though.
In terms of positioning the fake arms, you don’t - at least not with code. If your pseudo limbs are welded to your view model root, you ONLY change the CFrame of the root. The welds will automatically take care of accurately moving the limbs around as needed.
In terms of the Transform method, animations internally use the Transform property of Motor6Ds to function. I have no clue if it’d work but it’d cut out the need to use the animation workaround and anything associated if so (ergo ignore first paragraph). In your RenderStepped function, you simply need to set the Transform of a pseudo limb’s Motor6D to that of the real limb’s.
viewModel["Left Arm"]["Left Shoulder"].Transform = character["Left Arm"]["Left Shoulder"].Transform
Something like that. This is hard-coded, I didn’t really consider abstraction.