To map the account holder's name to an API field, have you tried using the billTo firstName and lastName fields?
e.g.
billto.firstName = "John"
billto.lastName = "Smith"
These get mapped to the paymentProfile object.
https://developer.authorize.net/api/reference/index.html#customer-profiles-create-customer-profile
Authorize.Net has two levels of profiles. There's a parent "customer profile", which has ID, email and description. Each customer profile can have associated "payment profiles" (with billing information including accountholder name) and "shipping profiles" (with shipping information).
When you pass just the createProfile flag in your transaction, as you are doing, it attempts to create a new Customer Profile and add the associated billing/shipping information to payment and shipping profiles under that Customer Profile. For the Customer Profile to be created successfully, at least one of ID, email or description has to be unique; I presume this is not the case in your transaction.
</payment>
<profile>
<createProfile>true</createProfile>
</profile>
<customer>
<id>99999456654</id>
</customer>
<billTo>
If you want to add a payment/shipping profile to an existing Customer Profile (e.g. when it's the same customer using a new payment method or shipping address), you have to not just specify the createProfile field in the transaction but also the customerProfileId; this lets the system know that the customer profile is existing, and it just needs to create the payment/shipping profiles and add them to that particular customer profile. Also, make sure you don't again include the customer fields (ID, email, description) in this transaction.
</payment>
<profile>
<createProfile>true</createProfile>
<customerProfileId>1915171911</customerProfileId>
</profile>
<billTo>
Hope this answers both your questions.