Hi Madman!
Maybe a bit late, but I've figured out the solution.
One problem is, that both id_carrier and $delivery_option[$cart->id_address_delivery] are not integers, but strings!
Also, the "$delivery_option[$cart->id_address_delivery]" string has a comma after it.
You have to also update the total price before you call the validateOrder function.
This code should work on PS 1.6.1.5:
(if you plan to add a product to the cart, recalculate the $total variable after you change the cart content)
$cart->id_carrier = "8";
$delivery_option = $cart->getDeliveryOption();
$delivery_option[$cart->id_address_delivery] = "8,";
$cart->setDeliveryOption($delivery_option);
$cart->update();
$total = $this->context->cart->getOrderTotal(true, Cart::BOTH);
$this->module->validateOrder((int)$this->context->cart->id, Configuration::get('PS_OS_PREPARATION'), $total, $this->module->displayName, null, array(), null, false, $customer->secure_key);
I hope this will help somebody else.