Regarding your "can't add a block using <reference name="left
/>, are you sure your CMS page has a block named left? For example, if you consider the default home page that ships with the Magento sample data, it appears to have a block named left.

However, if you look at the page in the backend, you can see it's set to use the root template
`2 columns with right bar`
and then in its content area, the left column is added using HTML markup (toggle the WYSIWYG to source view)
<div class="col-left side-col">
<p class="home-callout"><a href="{{store direct_url="apparel/shoes/womens/anashria-womens-premier-leather-sandal.html"}}"><img src="{{skin url='images/ph_callout_left_top.gif'}}" alt="" border="0" /></a></p>
<p class="home-callout"><img src="{{skin url='images/ph_callout_left_rebel.jpg'}}" alt="" border="0" /></p>
{{block type="tag/popular" template="tag/popular.phtml"}}</div>
This directed graph makes it clear there's no block named left
to hook into (click for full sized image)

Regarding setting a template, if you look at the source for the "Layout" drop down
<select id="page_root_template" name="root_template" class=" required-entry select">
<option value="empty">Empty</option>
<option value="one_column">1 column</option>
<option value="two_columns_left">2 columns with left bar</option>
<option value="two_columns_right" selected="selected">2 columns with right bar</option>
<option value="three_columns">3 columns</option>
</select>
You can see when you're setting this field, the actual value getting saved is something like one_column
, two_columns_left
, etc. These values corespond to layout handles of the same name.
#File: app/design/frontend/default/modern/layout/page.xml
<page_one_column translate="label">
<label>All One-Column Layout Pages</label>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
<!-- Mark root page block that template is applied -->
<action method="setIsHandle"><applied>1</applied></action>
<action method="setLayoutCode"><name>one_column</name></action>
</reference>
</page_one_column>
...
<page_two_columns_left translate="label">
<label>All Two-Column Layout Pages (Left Column)</label>
<reference name="root">
<action method="setTemplate"><template>page/2columns-left.phtml</template></action>
<!-- Mark root page block that template is applied -->
<action method="setIsHandle"><applied>1</applied></action>
<action method="setLayoutCode"><name>two_columns_left</name></action>
</reference>
</page_two_columns_left>
When Magento is rendering a CMS page, it references the saved values, and adds the appropriate layout handle to the page. While it's tangential to the question, that handle is added here
#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _renderPage(Mage_Core_Controller_Varien_Action $action, $pageId = null, $renderLayout = true)
{
//...
$action->addActionLayoutHandles();
if ($page->getRootTemplate()) {
$handle = ($page->getCustomRootTemplate()
&& $page->getCustomRootTemplate() != 'empty'
&& $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
$action->getLayout()->helper('page/layout')->applyHandle($handle);
}
//...
}
More importantly though is the order the layout handles are added in

As you can see in the screenshot above, the page_two_columns_right
handle is added after the cms_index_index
handle. This means if you add layout xml update code to change the template in cms_index_index
your code will run, but then the layout update xml code in page_two_columns_right
will run after it.
I've always suspected this is by design to ensure the template set in the user interface is always correct. In previous version of Magento the <action method="setIsHandle"><applied>1</applied></action>
method call seems to have existed for the same reasons.
So, there's no way to do what you want using pure layout xml code. If you're comfortable with creating custom modules and observer code, then look into the cms_page_render
event. This fires right before loadLayoutUpdates
is called, and would let you slide an additional handle name in, or remove the existing handle names.