If your plugin uses its own methods to render a map layer, writing your own layer type based on QgsPluginLayer might be the best way to implement that.
Below is an example of a minimal QgsPluginLayer implementation. It is an excerpt of the Watermark example plugin
class WatermarkPluginLayer(QgsPluginLayer):
  LAYER_TYPE="watermark"
  def __init__(self):
    QgsPluginLayer.__init__(self, WatermarkPluginLayer.LAYER_TYPE, "Watermark plugin layer")
    self.setValid(True)
  def draw(self, rendererContext):
    image = QImage("myimage.png")
    painter = rendererContext.painter()
    painter.save()
    painter.drawImage(10, 10, image)
    painter.restore()
    return True
Methods for reading and writing specific information to the project file can also be added
def readXml(self, node):
  pass
def writeXml(self, node, doc):
  pass
When loading a project containing such a layer, a factory class is needed
class WatermarkPluginLayerType(QgsPluginLayerType):
  def __init__(self):
    QgsPluginLayerType.__init__(self, WatermarkPluginLayer.LAYER_TYPE)
  def createLayer(self):
    return WatermarkPluginLayer()
You can also add code for displaying custom information in the layer properties
def showLayerProperties(self, layer):
  pass