Here's an example of using a popup with a dynamic map service:
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=7,IE=9" />
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <title></title>
    <link rel="stylesheet" href="http://serverapi.arcgisonline.com/jsapi/arcgis/2.5/js/dojo/dijit/themes/tundra/tundra.css">
    <link rel="stylesheet" href="http://serverapi.arcgisonline.com/jsapi/arcgis/2.5/js/esri/dijit/css/Popup.css">
    <style>
      html, body { height: 100%; width: 100%; margin: 0; padding: 0; }
      #map{ margin: 0; padding: 0; }
    </style>
    <script>var dojoConfig = { parseOnLoad: true };</script>
    <script src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=2.5"></script>
    <script>
      dojo.require("dijit.layout.BorderContainer");
      dojo.require("dijit.layout.ContentPane");
      dojo.require("esri.map");
      dojo.require("esri.tasks.query");
      dojo.require("esri.dijit.Popup");
      
      var map;
      function init() {
        var dynSvc = new esri.layers.ArcGISDynamicMapServiceLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer",{"opacity":0.5});
        var ext = new esri.geometry.Extent({"xmin":-97.968323,"ymin":32.405333,"xmax":-86.220025,"ymax":37.006985,"spatialReference":{"wkid":4269}});
        var popup = new esri.dijit.Popup(null, dojo.create("div"));
        
        map = new esri.Map("map", { 
          "extent": ext, 
          "infoWindow": popup
        });
        map.addLayer(dynSvc);
        dojo.connect(map, 'onClick', queryCounties);
        
        dojo.connect(map, 'onLoad', function() { 
          dojo.connect(dijit.byId('map'), 'resize', map, map.resize);
        });
      }
      function queryCounties(e) {
        // build an extent around the click point
        var pad = map.extent.getWidth() / map.width * 3;
        var queryGeom = new esri.geometry.Extent(e.mapPoint.x - pad, e.mapPoint.y - pad, e.mapPoint.x + pad, e.mapPoint.y + pad, map.spatialReference);
        var q = new esri.tasks.Query();
        q.outSpatialReference = {"wkid": 4269};
        q.returnGeometry = true;
        q.outFields = ["NAME", "STATE_FIPS", "CNTY_FIPS"];
        q.geometry = queryGeom;
        var popupTemplate = new esri.dijit.PopupTemplate({
          title: "{NAME}",
          fieldInfos: [
            { fieldName: "CNTY_FIPS", visible: true, label: "County FIPS: " },
            { fieldName: "STATE_FIPS", visible: true, label: "State FIPS: " }
          ]
        });
        var qt = new esri.tasks.QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/3");
        var def = qt.execute(q);
        def.addCallback(function(result) {
          return dojo.map(result.features, function(f) {
            f.setInfoTemplate(popupTemplate);
            return f;
          });
        }); 
        // use the deferred returned from the query task to set
        // the popup features
        map.infoWindow.setFeatures([def]);
        // show the popup
        map.infoWindow.show(e.screenPoint, map.getInfoWindowAnchor(e.screenPoint));
      }
      dojo.ready(init);
    </script>
  </head>
  
  <body class="tundra">
    <div data-dojo-type="dijit.layout.BorderContainer" 
         data-dojo-props="design:'headline',gutters:false" 
         style="width: 100%; height: 100%; margin: 0;">
      <div id="map" 
           data-dojo-type="dijit.layout.ContentPane" 
           data-dojo-props="region:'center'"> 
      </div>
    </div>
  </body>
</html>
JSFiddle:  http://jsfiddle.net/swingley/Bkswj/This sample is using a query task to get features that intersect a click point and then using the deferred returned by the query task to set features for the map's popup.If you're underlying data is time-enabled, use a timeExtent property on your query to query by time.