S
As mentioned by Leon in comments you should use a new JObject in your loop instead of the array reference you have.
Reason why your code is adding the same values (objects really):
The memory location for your object gets allocated when you create it:
dynamic product_Price = new JObject();
When you add the object to the array, a reference of the address is stored
product_Price_array.Add(product_Price);
On clearing it, and then adding new values in product_Price, the values inside are removed, and new values are added, but the original location has not changed, so all the object you add to product_Price_array are pointing to the same address (and also the same object).
product_Price.RemoveAll();
If instead RemoveAll, you would just create a new JObject, this will create a new product_Price object at a different address, which will then get added to your array at the end.
product_Price = new JObject();
I would suggest you have a look at how arrays work
Also, not sure why are you using a Dynamic object why not just use a JObject