It's content does not display?
The content placeholder should not have content on your masterpage.
You need to assign an id to your placeholders like you did and then use that in your child pages to designate what placeholder to replace
on MasterPage you got it right, so i suspect it's your details page which are not included, which is where the problem is
<div id="page-left">
<asp:ContentPlaceHolder ID="leftContent" runat="server">
This text will be replaced
</asp:ContentPlaceHolder>
</div>
And then on your details pages, designate what placeholder to address
<asp:Content runat="server" ContentPlaceHolderID="leftContent">
<p>I'm showing in the left placeholder!</p>
</asp:Content>
An update based on comments, since what you're wanting to do is populate your lefthand side menu based on ajax, you really don't have anything you have to do server side, at least on a page level. So step one is to remove the contentplaceholder and decide not to want to use a server side technology with a clientside one that way.
Next up when the DOM has loaded, startup your ajax call to your presumably api controller in a scripts tag in your masterpage bottom (as that will load the last)
function TheResultReadyFunction(data){
var menuSource = 'No really here you construct the menu based on menu data';
$("#page-left").html(menuSource);
}
$(document).ready(function(){
var menupagecontext = "<%: ProtectedStringWithWhatDefinesMenuViewToGet %>";
$.getJSON("API/GetAMenu/?request=" + menupagecontext)
.done(TheResultReadyFunction);
Remember Ajax is a clientside technology for issueing http get's and posts outside your page lifecycle. Asp.Net master/ detail technology is a server side abstraction allowing you to reuse code across (details) pages.
You can injext menu to a details page's masterpage controls too, but then you won't need ajax and it will not be dynamic inherently without combining technologies which for various reasons is not recommended imo.